const StallModel = require('../model/StallModel');

class StallController {
    /** 获取列表 */
    static async getList(req, res) {
        try {
            const { page, pagesize, name, status } = req.query;

            // 参数验证
            const pageNum = page ? Number(page) : 1;
            if (isNaN(pageNum) || pageNum < 1) {
                return res.status(400).json({ code: 1, msg: '页码必须是大于0的数字' });
            }

            const pageSize = pagesize ? Number(pagesize) : 10;
            if (isNaN(pageSize) || pageSize < 1 || pageSize > 100) {
                return res.status(400).json({ code: 1, msg: '每页数量必须是1-100之间的数字' });
            }

            // 验证 name
            if (name && (typeof name !== 'string' || name.length > 100)) {
                return res.status(400).json({ code: 1, msg: '名称长度不能超过100个字符' });
            }

            // 验证 status
            if (status !== undefined && status !== null) {
                const statusNum = Number(status);
                if (isNaN(statusNum) || (statusNum !== 0 && statusNum !== 1 && statusNum !== 2)) {
                    return res.status(400).json({ code: 1, msg: '状态必须是0、1或2' });
                }
            }

            // 调用模型获取数据
            const result = await StallModel.getList({
                page: pageNum,
                pageSize,
                name,
                status: status !== undefined && status !== null ? Number(status) : undefined
            });

            // 返回结果
            return res.json({
                code: 0,
                msg: '成功',
                data: {
                    list: result.list.map(row => ({ ...row })),
                    total: result.total
                }
            });
        } catch (error) {
            console.error('获取档口列表失败:', error);
            return res.status(500).json({
                code: 1,
                msg: '服务器错误',
                error: error.message
            });
        }
    }


    // 新增
    static async create(req, res) {
        try {
            // 验证输入参数
            const { name, business_hours, notes, status, main_body, contact_phone, position } = req.body;

            // 验证必填字段
            if (!name) {
                return res.status(400).json({ code: 1, message: '档口名称不能为空' });
            }

            if (!main_body) {
                return res.status(400).json({ code: 1, message: '负责人姓名不能为空' });
            }

            if (!contact_phone) {
                return res.status(400).json({ code: 1, message: '联系电话不能为空' });
            }

            // 验证数据类型和长度
            if (typeof name !== 'string' || name.length > 100) {
                return res.status(400).json({ code: 1, message: '档口名称必须是长度不超过100的字符串' });
            }

            if (typeof main_body !== 'string' || main_body.length > 30) {
                return res.status(400).json({ code: 1, message: '负责人姓名必须是长度不超过30的字符串' });
            }

            if (typeof contact_phone !== 'string' || !/^\d{11}$/.test(contact_phone)) {
                return res.status(400).json({ code: 1, message: '联系电话必须是11位数字' });
            }

            if (business_hours !== undefined && (typeof business_hours !== 'string' || business_hours.length > 100)) {
                return res.status(400).json({ code: 1, message: '营业时间必须是长度不超过100的字符串' });
            }

            if (notes !== undefined && typeof notes !== 'string') {
                return res.status(400).json({ code: 1, message: '备注必须是字符串' });
            }

            if (position !== undefined && typeof position !== 'string') {
                return res.status(400).json({ code: 1, message: '位置必须是字符串' });
            }

            if (status !== undefined) {
                const statusNum = Number(status);
                if (isNaN(statusNum) || (statusNum !== 0 && statusNum !== 1)) {
                    return res.status(400).json({ code: 1, message: '状态必须是0或1' });
                }
            }

            const data = {
                name,
                main_body,
                contact_phone,
                business_hours: business_hours || '',
                notes: notes || '',
                position: position || '',
                status: status !== undefined ? Number(status) : 1
            };

            const id = await StallModel.create(data);
            res.json({ code: 0, message: '新增成功', data: { stall_id: id } });
        } catch (err) {
            res.status(500).json({ code: 1, message: '新增失败', error: err.message });
        }
    }

    // 编辑档口
    static async update(req, res) {
        const { id } = req.params;

        // 添加对req.body的检查
        if (!req.body) {
            return res.status(400).json({ code: 1, message: '请求体不能为空' });
        }

        const { name, business_hours, notes, status,contact_phone,main_body, position } = req.body;
        // console.log(req.body,'前端传过来的数据');
        // 验证ID参数
        if (!id) {
            return res.status(400).json({ code: 1, message: '档口ID不能为空' });
        }

        const idNum = Number(id);
        if (isNaN(idNum) || idNum <= 0) {
            return res.status(400).json({ code: 1, message: '档口ID必须是大于0的数字' });
        }

        // 验证提供的参数
        const data = {};

        if (name !== undefined) {
            if (typeof name !== 'string' || name.length > 100) {
                return res.status(400).json({ code: 1, message: '档口名称必须是长度不超过100的字符串' });
            }
            data.name = name;
        }

        if (business_hours !== undefined) {
            if (typeof business_hours !== 'string' || business_hours.length > 100) {
                return res.status(400).json({ code: 1, message: '营业时间必须是长度不超过100的字符串' });
            }
            data.business_hours = business_hours;
        }

        if (notes !== undefined) {
            if (typeof notes !== 'string') {
                return res.status(400).json({ code: 1, message: '备注必须是字符串' });
            }
            data.notes = notes;
        }

        if (position !== undefined) {
            if (typeof position !== 'string') {
                return res.status(400).json({ code: 1, message: '位置必须是字符串' });
            }
            data.position = position;
        }

        if (status !== undefined) {
            const statusNum = Number(status);
            if (isNaN(statusNum) || (statusNum !== 0 && statusNum !== 1 && statusNum !== 2)) {
                return res.status(400).json({ code: 1, message: '状态必须是0、1或2' });
            }
            data.status = statusNum;
        }

        // 新增contact_phone校验
        if (contact_phone !== undefined) {
            if (typeof contact_phone !== 'string' || contact_phone.length > 20) {
                return res.status(400).json({ code: 1, message: '联系方式必须是长度不超过20的字符串' });
            }
            data.contact_phone = contact_phone;
        }

        // 新增main_body校验
        if (main_body !== undefined) {
            if (typeof main_body !== 'string' || main_body.length > 30) {
                return res.status(400).json({ code: 1, message: '负责人必须是长度不超过30的字符串' });
            }
            data.main_body = main_body;
        }

        // 检查是否有要更新的数据
        if (Object.keys(data).length === 0) {
            return res.status(400).json({ code: 1, message: '没有提供要更新的数据' });
        }

        try {
            const affected = await StallModel.update(id, data);
            if (!affected) {
                return res.status(404).json({ code: 1, message: '档口不存在' });
            }
            res.json({ code: 0, message: '更新成功' });
        } catch (err) {
            res.status(500).json({ code: 1, message: '更新失败', error: err.message });
        }
    }

    // 删除
    static async remove(req, res) {
        const { id } = req.params;

        // 验证ID参数
        if (!id) {
            return res.status(400).json({ code: 400, message: '档口ID不能为空' });
        }

        const idNum = Number(id);
        if (isNaN(idNum) || idNum <= 0) {
            return res.status(400).json({ code: 400, message: '档口ID必须是大于0的数字' });
        }

        try {
            const affected = await StallModel.remove(id);
            if (!affected) return res.status(404).json({ code: 1, message: '档口不存在' });
            res.json({ code: 0, message: '删除成功' });
        } catch (err) {
            res.status(500).json({ code: 1, message: '删除失败', error: err.message });
        }
    }

    // 查看档口
    static async getDetail(req, res) {
        const { id } = req.params;

        // 验证ID参数
        if (!id) {
            return res.status(400).json({ code: 1, message: '档口ID不能为空' });
        }

        const idNum = Number(id);
        if (isNaN(idNum) || idNum <= 0) {
            return res.status(400).json({ code: 1, message: '档口ID必须是大于0的数字' });
        }

        try {
            const result = await StallModel.getDetail(idNum);

            if (!result) {
                return res.status(404).json({ code: 1, message: '档口不存在' });
            }

            return res.json({
                code: 0,
                msg: '成功',
                data: result
            });
        } catch (error) {
            console.error('获取档口详情失败:', error);
            return res.status(500).json({
                code: 1,
                msg: '服务器错误',
                error: error.message
            });
        }
    }
}

module.exports = StallController;